iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 10
1

Retrofit

Retrofit是針對Android的網絡請求框架,遵循Restful設計風格,支持同步/異步網絡請求與數據的解析,並且通過註解配置網絡請求參數。
Retrofit很強大這邊就介紹最一般的讀取Json利用GsonConverterFactory解析資料。

addConverterFactory("解析器"):回傳資料解析器
baseUrl("URL"):固定的API網址,後續要只需要在service中增加API
@GET("連線API的URL"):利用GET方式取得API

Retrofit配合Coroutines,並且使用Gson解析器

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
 
dependencies {
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.7.2'
}

讀取網路增加權限(AndroidManifest.xml)

<uses-permission android:name="android.permission.INTERNET"/>

創建RetrofitUtil(變成工具類方便創建)

class RetrofitUtil {
    private var retrofit = Retrofit.Builder()
        .addConverterFactory(GsonConverterFactory.create())
        .baseUrl("https://gank.io/api/")
        .build()

    companion object {
        val instance : RetrofitUtil by lazy { RetrofitUtil() }
    }

    fun <T> getService(clazz: Class<T>) = retrofit.create(clazz)
}

定義回傳的資料

data class HttpResult(val data: List<MyModel>, val total_counts: Int)
data class MyModel(val author: String, val category: String, val desc: String, val title: String)

創建interface 要使用的API放在這

interface MyService {
    @GET("v2/data/category/Girl/type/Girl/page/1/count/10")
    suspend fun getPage() : HttpResult
}

MainActivity.kt

class MainActivity : AppCompatActivity() {
    //宣告懶加載
    private val myService by lazy {
        RetrofitUtil.instance.getService(MyService::class.java)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        CoroutineScope(Dispatchers.IO).launch {
            val pages = myService.getPage()

            for (page in pages.data) {
                Log.d("GG-data", page.title)
            }

            Log.d("GG-data size", pages.data.size.toString())
            Log.d("GG-total size", pages.total_counts.toString())
        }
    }
}


上一篇
{Day9} Room
下一篇
{Day11} Repository
系列文
Kotlin Android Jetpack 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言